x11: Avoid setting has_pointer_focus if a EWMH compliant WM is present
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 12 Feb 2016 20:59:29 +0000 (21:59 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 12 Feb 2016 21:05:30 +0000 (22:05 +0100)
This is mostly useful to have focus behave sanely on lack of WM, so avoid
any check there if we're positive there is a WM handling focus.

https://bugzilla.gnome.org/show_bug.cgi?id=677329

gdk/x11/gdkdevicemanager-core-x11.c
gdk/x11/gdkeventsource.c

index 8d6848869e0d80f9fc84eabbb149c03d18d99441..a16f9313327229b9c0d14417241a994c113196bb 100644 (file)
@@ -820,6 +820,7 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
                                        int        mode)
 {
   GdkToplevelX11 *toplevel;
+  GdkX11Screen *x11_screen;
   gboolean had_focus;
 
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -841,6 +842,7 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
     return;
 
   had_focus = HAS_FOCUS (toplevel);
+  x11_screen = GDK_X11_SCREEN (gdk_window_get_screen (window));
 
   switch (detail)
     {
@@ -854,6 +856,7 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
        * has_focus_window case.
        */
       if (toplevel->has_pointer &&
+          !x11_screen->wmspec_check_window &&
           mode != NotifyGrab &&
 #ifdef XINPUT_2
          mode != XINotifyPassiveGrab &&
@@ -884,7 +887,8 @@ _gdk_device_manager_core_handle_focus (GdkWindow *window,
        * but the pointer focus is ignored while a
        * grab is in effect
        */
-      if (mode != NotifyGrab &&
+      if (!x11_screen->wmspec_check_window &&
+          mode != NotifyGrab &&
 #ifdef XINPUT_2
          mode != XINotifyPassiveGrab &&
          mode != XINotifyPassiveUngrab &&
index 7fff28f0c2f35189cfcf1ddbb099e2f76b33dce8..11929c61f92e14e329617c43d94e8dddce60c5f6 100644 (file)
@@ -132,11 +132,16 @@ static void
 handle_focus_change (GdkEventCrossing *event)
 {
   GdkToplevelX11 *toplevel;
+  GdkX11Screen *x11_screen;
   gboolean focus_in, had_focus;
 
   toplevel = _gdk_x11_window_get_toplevel (event->window);
+  x11_screen = GDK_X11_SCREEN (gdk_window_get_screen (event->window));
   focus_in = (event->type == GDK_ENTER_NOTIFY);
 
+  if (x11_screen->wmspec_check_window)
+    return;
+
   if (!toplevel || event->detail == GDK_NOTIFY_INFERIOR)
     return;